package com.panda.cn.config.exception;

import com.panda.cn.utils.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

/**
 * @author: menghao.yan
 * @create: Created in 2021/2/6
 * @description: 自定义异常处理类
 */

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义中断休息异常
     */
    @ExceptionHandler(RestfulException.class)
    @ResponseBody
    public R<String> handleRestfulException(RestfulException e) {
        // 打印异常信息
        log.error(">>> 中断信息:{} ", e.getMessage());
        return e.getR();
    }
    
    /**
     * 处理自定义异常
     */
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public R<String> handleCustomException(CustomException e) {
        // 打印异常信息
        log.error(">>> 异常信息:{} ", e.getMessage());
        return e.getR();
    }
    
    /**
     * 处理所有不可知的异常
     */
    @ExceptionHandler(ReamException.class)
    @ResponseBody
    public R<String> handleReamException(ReamException e) {
        // 打印异常信息
        log.error(">>> 令牌异常:{} ", e.getMessage());
        return e.getR();
    }
    
    /**
     * 处理所有不可知的异常
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R<String> handleOtherException(Exception e) {
        //打印异常堆栈信息
        e.printStackTrace();
        // 打印异常信息
        log.error(">>> 不可知的异常:{} ", e.getMessage());
        return R.fail().error("不可知异常");
    }

    /**
     * 处理所有不可知的异常
     */
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    @ResponseBody
    public R<String> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        //打印异常堆栈信息
        e.printStackTrace();
        // 打印异常信息
        log.error(">>> 上传文件过大:{} ", e.getMessage());
        return R.fail().error("上传文件过大");
    }
}
